package main

import "fmt"

// 执行顺序:
// 全局变量 -> init() -> main()

// 执行时机: Go语言程序启动会先从main包检查其导入的所有包 ，每个包又可能导入了其他的包，由此Go编译器由此构建出一个树状的包引用关系，再根据引用顺序决定编译顺序，依次编译这些包的代码。
// 1. main引用的同级包,按引用顺序依次编译
// 2.包中再引用包，最底层的叶子节点的init（）先编译，依次往上调用
// 即，在运行启动时，最后导入的包会最先初始化并调用其init()函数，
var a = b + c

var b = f() // 需要调用 f() 函数
var c = 1

func f() int {
	fmt.Println("f")
	return c + 1
}

func init() {
	fmt.Println("init")
}

func main() {
	fmt.Println(a)
	fmt.Println(b)
	fmt.Println(c)

}
